//package com.source.code.extractor.impl.child;
//
//import com.github.javaparser.ast.CompilationUnit;
//import com.github.javaparser.ast.Node;
//import com.github.javaparser.ast.NodeList;
//import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
//import com.github.javaparser.ast.expr.Expression;
//import com.github.javaparser.ast.expr.MethodCallExpr;
//import com.github.javaparser.ast.expr.NameExpr;
//import com.source.code.extractor.ChildMethodExtractor;
//import com.source.code.model.MethodChildInfo;
//import com.source.code.variable.VariableTypeUtil;
//import java.util.List;
//
///**
// * Child 方法 All Extractor
// *
// * @author wangchangjie
// * @date 2024/02/05
// */
//public class ChildMethodAllExtractor implements ChildMethodExtractor {
//
//    @Override
//    public void processMethodCall(
//        MethodCallExpr callExpr, ClassOrInterfaceDeclaration classDeclaration,
//        CompilationUnit compilationUnit, List<MethodChildInfo> calledMethods) {
//        String methodName;
//        String methodAbsName;
//        String classAllName;
//        String simpleName = callExpr.getNameAsString();
//
//        if (callExpr.getScope().isPresent() && callExpr.getScope().get() instanceof NameExpr) {
//            // 如果方法调用有作用域（即不是静态调用）
//            String objectType = callExpr.getScope().map(Node::toString).orElse("unKnowFind");
//            String variableType = VariableTypeUtil.findVariableType(objectType, compilationUnit,
//                classDeclaration);
//            methodName = variableType + "#" + simpleName;
//            methodAbsName = calculateMethodAbsName("TODO",callExpr, compilationUnit, classDeclaration);
//            classAllName = variableType;
//        } else {
//            // 如果方法调用是静态调用
//            methodName = classDeclaration.getFullyQualifiedName().get() + "#" + simpleName;
//            methodAbsName = calculateMethodAbsName("TODO",callExpr, compilationUnit, classDeclaration);
//            classAllName = classDeclaration.getFullyQualifiedName().get();
//        }
//
//        calledMethods.add(new MethodChildInfo()
//            .setMethodAllName(methodName)
//            .setSimpleName(simpleName)
//            .setClassAllName(classAllName)
//            .setMethodAbsName(methodAbsName));
//    }
//
//    @Override
//    public String calculateMethodAbsName(String methodClassPath, MethodCallExpr callExpr,
//        CompilationUnit compilationUnit,
//        ClassOrInterfaceDeclaration classDeclaration) {
//        // 初始化一个 StringBuilder 来构建 methodAbsName
//        StringBuilder absNameBuilder = new StringBuilder();
//
//        // 添加类名和方法名
//        absNameBuilder.append(classDeclaration.getFullyQualifiedName().orElse("unknown"))
//            .append("#")
//            .append(callExpr.getNameAsString())
//            .append("(");
//
//        // 获取方法调用的参数列表
//        NodeList<Expression> arguments = callExpr.getArguments();
//
//        // 遍历每个参数以获取其类型
//        for (int i = 0; i < arguments.size(); i++) {
//            Expression argument = arguments.get(i);
//            // 获取变量的类型
//            String type = VariableTypeUtil.findVariableType(argument.toString(), compilationUnit,
//                classDeclaration);
//            absNameBuilder.append(type).append(" ").append("var").append(i).append(", ");
//        }
//
//        // 如果存在参数，则移除尾部的 ", "
//        if (!arguments.isEmpty()) {
//            absNameBuilder.delete(absNameBuilder.length() - 2, absNameBuilder.length());
//        }
//
//        // 以 ")" 结束 methodAbsName
//        absNameBuilder.append(")");
//
//        // 返回构建的 methodAbsName 字符串
//        return absNameBuilder.toString();
//    }
//}
